package service.array;
import domain.dto.*;
import domain.entity.*;
import domain.vo.*;
import service.*;

public class UserService extends BaseService<User, UserDto, UserVo>
        implements IUserService {
    private static IUserService singleton;
    private UserService() {
        this.deptService = DeptService.getInstance();
        this.roleService = RoleService.getInstance();
    }
    public static IUserService getInstance() {
        if(singleton == null) {
            singleton = new UserService();
        }
        return singleton;
    }
    private final IDeptService deptService;
    private final IRoleService roleService;

/**
 * 根据⽤户传输对象（UserDto）和⽤户 ID 创建⼀个新的⽤户实体对象（User）。
 *
 * @param dto 传⼊的⽤户传输对象，包含⽤户的基本信息
 * @param id 为新创建的⽤户实体指定的唯⼀ ID
 * @return 返回创建好的⽤户实体对象
 */
@Override
  User createEntity(UserDto dto, int id) {
    return new User(id,dto.username, dto.name, dto.mobile, dto.email, dto.deptId, dto.roleId);
}


/**
 * 根据⽤户传输对象（UserDto）更新⽤户实体对象（User）的属性值。
 *
 * @param dto 传⼊的⽤户传输对象，包含需要更新的⽤户信息
 * @param user 需要更新的⽤户实体对象
 */
@Override
 void updateEntity(UserDto dto, User user) {
    // 使⽤传⼊的⽤户传输对象（UserDto）更新⽤户实体对象的属性
    user.username = dto.username;
    user.name = dto.name;
    user.mobile = dto.mobile;
    user.email = dto.email;
    user.deptId = dto.deptId;
    user.roleId = dto.roleId;
}
    @Override
    public Result create(UserDto dto) {
        // 验证部⻔ID是否存在
        if (!deptService.existsById(dto.deptId)) {
            // 如果指定的部⻔ID不存在，返回失败结果
            return Result.failure("创建失败，不存在该部⻔");
        }
        // 验证⻆⾊ID是否存在
        if (!roleService.existsById(dto.roleId)) {
            // 如果指定的⻆⾊ID不存在，返回失败结果
            return Result.failure("创建失败，不存在该⻆⾊");
        }
        return super.create(dto);
    }

    @Override
     UserVo convertToVo(User user) {
        // 查找部⻔名称
        String deptName = "";
        // 调⽤ DeptService 的 findById ⽅法，根据⽤户的部⻔ ID 查找部⻔信息
        Dept dept = deptService.findById(user.deptId);
        if (dept != null) {
            // 如果找到部⻔信息，将部⻔名称赋值给 deptName
            deptName = dept.name;
        }
        // 查找⻆⾊名称
        String roleName = "";
        // 调⽤ RoleService 的 findById ⽅法，根据⽤户的⻆⾊ ID 查找⻆⾊信息
        Role role = roleService.findById(user.roleId);
        if (role != null) {
            // 如果找到⻆⾊信息，将⻆⾊名称赋值给 roleName
            roleName = role.name;
        }
        // 创建并返回 UserVo 对象
        return new UserVo(user.getId(), user.username, user.name, user.mobile,
                user.email, user.deptId, user.roleId, user.enabled, deptName, roleName);
    }
    /**
     * {@inheritDoc}
     * <p>
     * 它⾸先要检查部⻔和⻆⾊是否存在，最后调⽤⽗类的update⽅法更新实体对象
     * </p>
     */
    @Override
    public Result update(UserDto dto, int id) {
        // 验证部⻔ID是否存在
        if (!deptService.existsById(dto.deptId)) {
            // 如果指定的部⻔ID不存在，返回失败结果
            return Result.failure("更新失败，不存在该部⻔");
        }
        // 验证⻆⾊ID是否存在
        if (!roleService.existsById(dto.roleId)) {
            // 如果指定的⻆⾊ID不存在，返回失败结果
            return Result.failure("更新失败，不存在该⻆⾊");
        }
        return super.update(dto, id);
    }
    @Override
    public  boolean deptInUse(int deptId) {
        boolean inUse = false;
        // 遍历存储⽤户数据的数组
        for (User user : data) {
            // 检查⽤户是否存在且该⽤户的部⻔ ID 等于传⼊的部⻔ ID
            if (user != null && user.deptId == deptId) {
                inUse = true;
                break;
            }
        }
        return inUse;
    }
    @Override
    public  boolean roleInUse(int roleId) {
        boolean inUse = false;
        // 遍历存储⽤户数据的数组
        for (User user : data) {
            // 检查⽤户是否存在且该⽤户的⻆⾊ ID 等于传⼊的⻆⾊ ID
            if (user != null && user.roleId == roleId) {
                inUse = true;
                break;
            }
        }
        return inUse;
    }

    @Override
    public  Result toggle(int id) {
        // 检查 ID 是否有效
        if (id < 1 || id >= idCounter || data[id] == null) {
            return Result.failure("切换状态失败，不存在该数据");
        }
        // 反转 `enabled` 状态
        data[id].enabled = !data[id].enabled;
        // 根据新的状态返回不同的成功消息
        return Result.success(data[id].enabled ? "启⽤成功" : "禁⽤成功",
                null);
    }
}
